#===istalismanplugin===
# -*- coding: utf-8 -*-

# $Revision: 56 $
# $Author: rchiganov@gmail.com $
# $Date: 2013-09-23 10:14:38 +0000 (Mon, 23 Sep 2013) $

#---------------------------------------------------------------------------------------------------

import xmpp
import random

#---------------------------------------------------------------------------------------------------

MUC_PENDING = [ ]

#---------------------------------------------------------------------------------------------------

def muc_access_set ( ptype, psource, pgroupchat, pjid, preason, ptypeq, prole):
	global MUC_PENDING

	liq = xmpp.Iq('set')
	liq.setTo(pgroupchat)
	lid = 'member' + str(random.randrange(1000, 9999))
	MUC_PENDING.append(lid)
	liq.setID(lid)
	lquery = xmpp.Node('query')
	lquery.setNamespace('http://jabber.org/protocol/muc#admin')

	if ptypeq == 'role':
		laction = lquery.addChild('item', { 'nick': pjid, ptypeq:prole })
	else:
		laction = lquery.addChild('item', { 'jid': pjid, ptypeq:prole })

	if preason:
		laction.setTagData('reason', preason)
	liq.addChild(node=lquery)

	JCON.SendAndCallForResponse(liq, muc_access_set_answer,{'ptype': ptype, 'psource': psource, 'pgroupchat': pgroupchat, 'pjid': pjid, 'ptypeq': ptypeq, 'prole': prole })

def muc_access_set_answer ( pcoze, pres, ptype, psource, pgroupchat, pjid, ptypeq, prole ):
	global MUC_PENDING

	lid = pres.getID()
	if lid in MUC_PENDING:
		MUC_PENDING.remove(lid)
	else:
		reply(ptype, psource, u'что то не так... *SCRATCH*')
		return

	lanswer = u''

	ltype = pres.getType()
	if ltype == 'result':
		ljid = pjid
		for litem in GROUPCHATS[pgroupchat].keys():
			if GROUPCHATS[pgroupchat][litem]['jid'].count(pjid + u'/') > 0:
				ljid = litem

		if ptypeq == 'affiliation' and prole == 'member':
			lanswer += u'вручила медальку %s и он стал мембером' % ljid
		elif ptypeq == 'affiliation' and prole == 'none':
			lanswer += u'сделала юзера %s никем...' % ljid
		elif ptypeq == 'affiliation' and prole == 'outcast':
			lanswer += u'сломала ноги %s... теперь не зайдёт...' % ljid
		elif ptypeq == 'affiliation' and prole == 'admin':
			lanswer += u'натянула на %s красные труселя... :-[' % ljid
		elif ptypeq == 'affiliation' and prole == 'owner':
			lanswer += u'выдала корону %s... ток не обижай маленьких' % ljid

		elif ptypeq == 'role' and prole == 'moderator':
			lanswer += u'выдала зелёные труселя %s... пусть носит :-)' % ljid
		elif ptypeq == 'role' and prole == 'participant':
			lanswer += u'поколдовала и вернула %s голос... *WIZARD*' % ljid
		elif ptypeq == 'role' and prole == 'visitor':
			lanswer += u'воткнула %s соску в одно место, отшлёпала и поставила в угол... *GIRL_DEVIL*' % ljid
		elif ptypeq == 'role' and prole == 'none':
			lanswer += u'отправила %s по всем известному пути с напутствием "хорошо добраться до места"...' % ljid

		else:
			lanswer += u'фиг его знает что писать *SCRATCH*'

	elif ltype == 'error':
		lanswer += u'не разрешено'

	else:
		lanswer += u'что-то не так... *SCRATCH*'

	reply(ptype, psource, lanswer)

#---------------------------------------------------------------------------------------------------

def muc_member ( ptype, psource, pparameters ):
	if not GROUPCHATS.has_key(psource[1]):
		reply(ptype, psource, u'эта команда доступна только в конференции')
		return

	lparam = pparameters.split()
	if len(lparam) != 1:
		reply(ptype, psource, u'читай хелп по команде...')
		return

	luser = u''
	if lparam[0].count('@') == 1:
		luser = lparam[0]
	elif GROUPCHATS[psource[1]].has_key(lparam[0]):
		luser = get_true_jid(psource[1] + '/' + lparam[0])
	else:
		reply(ptype, psource, u'а эт хто такой? *SCRATCH*')
		return

	muc_access_set(ptype, psource, psource[1], luser, None, 'affiliation', 'member')

#---------------------------------------------------------------------------------------------------

def muc_moder ( ptype, psource, pparameters ):
	if not GROUPCHATS.has_key(psource[1]):
		reply(ptype, psource, u'эта команда доступна только в конференции')
		return

	lparam = pparameters.split()
	if len(lparam) < 1:
		reply(ptype, psource, u'читай хелп по команде...')
		return

	luser = u''
	if lparam[0].count('@') == 1:
		for litem in GROUPCHATS[psource[1]].keys():
			if GROUPCHATS[psource[1]][litem]['jid'].count(lparam[0] + u'/') > 0:
				luser = litem
	else:
		luser = lparam[0]

	if GROUPCHATS[psource[1]].has_key(luser):
		if GROUPCHATS[psource[1]][luser]['ishere'] != 1:
			reply(ptype, psource, u'его щас нет *PARDON*')
			return
	else:
		reply(ptype, psource, u'а эт хто такой? *SCRATCH*')
		return

	muc_access_set(ptype, psource, psource[1], luser, None, 'role', 'moderator')

#---------------------------------------------------------------------------------------------------

def muc_none ( ptype, psource, pparameters ):
	if not GROUPCHATS.has_key(psource[1]):
		reply(ptype, psource, u'эта команда доступна только в конференции')
		return

	lparam = pparameters.split()
	if len(lparam) != 1:
		reply(ptype, psource, u'читай хелп по команде...')
		return

	luser = u''
	if lparam[0].count('@') == 1:
		luser = lparam[0]
	elif GROUPCHATS[psource[1]].has_key(lparam[0]):
		luser = get_true_jid(psource[1] + '/' + lparam[0])
	else:
		reply(ptype, psource, u'а эт хто такой? *SCRATCH*')
		return

	muc_access_set(ptype, psource, psource[1], luser, None, 'affiliation', 'none')

#---------------------------------------------------------------------------------------------------

def muc_participant ( ptype, psource, pparameters ):
	if not GROUPCHATS.has_key(psource[1]):
		reply(ptype, psource, u'эта команда доступна только в конференции')
		return

	lparam = pparameters.split()
	if len(lparam) != 1:
		reply(ptype, psource, u'читай хелп по команде...')
		return

	luser = u''
	if lparam[0].count('@') == 1:
		for litem in GROUPCHATS[psource[1]].keys():
			if GROUPCHATS[psource[1]][litem]['jid'].count(lparam[0] + u'/') > 0:
				luser = litem
	else:
		luser = lparam[0]

	if GROUPCHATS[psource[1]].has_key(luser):
		if GROUPCHATS[psource[1]][luser]['ishere'] != 1:
			reply(ptype, psource, u'его щас нет *PARDON*')
			return
	else:
		reply(ptype, psource, u'а эт хто такой? *SCRATCH*')
		return

	muc_access_set(ptype, psource, psource[1], luser, None, 'role', 'participant')

#---------------------------------------------------------------------------------------------------

def muc_visitor ( ptype, psource, pparameters ):
	if not GROUPCHATS.has_key(psource[1]):
		reply(ptype, psource, u'эта команда доступна только в конференции')
		return

	lparam = pparameters.split()
	if len(lparam) != 1:
		reply(ptype, psource, u'читай хелп по команде...')
		return

	luser = u''
	if lparam[0].count('@') == 1:
		for litem in GROUPCHATS[psource[1]].keys():
			if GROUPCHATS[psource[1]][litem]['jid'].count(lparam[0] + u'/') > 0:
				luser = litem
	else:
		luser = lparam[0]

	if GROUPCHATS[psource[1]].has_key(luser):
		if GROUPCHATS[psource[1]][luser]['ishere'] != 1:
			reply(ptype, psource, u'его щас нет *PARDON*')
			return
	else:
		reply(ptype, psource, u'а эт хто такой? *SCRATCH*')
		return

	muc_access_set(ptype, psource, psource[1], luser, None, 'role', 'visitor')

#---------------------------------------------------------------------------------------------------

def muc_kick ( ptype, psource, pparameters ):
	if not GROUPCHATS.has_key(psource[1]):
		reply(ptype, psource, u'эта команда доступна только в конференции')
		return

	lparam = pparameters.split()
	if len(lparam) < 1:
		reply(ptype, psource, u'читай хелп по команде...')
		return

	luser = u''
	if lparam[0].count('@') == 1:
		for litem in GROUPCHATS[psource[1]].keys():
			if GROUPCHATS[psource[1]][litem]['jid'].count(lparam[0] + u'/') > 0:
				luser = litem
	else:
		luser = lparam[0]

	if GROUPCHATS[psource[1]].has_key(luser):
		if GROUPCHATS[psource[1]][luser]['ishere'] != 1:
			reply(ptype, psource, u'его щас нет *PARDON*')
			return
	else:
		reply(ptype, psource, u'а эт хто такой? *SCRATCH*')
		return

	lreason = u''
	if len(lparam) > 1:
		lreason = pparameters[len(lparam[0]) + 1:].strip()
	else:
		lreason = None

	muc_access_set(ptype, psource, psource[1], luser, lreason, 'role', 'none')

#---------------------------------------------------------------------------------------------------

def muc_ban ( ptype, psource, pparameters ):
	if not GROUPCHATS.has_key(psource[1]):
		reply(ptype, psource, u'эта команда доступна только в конференции')
		return

	lparam = pparameters.split()
	if len(lparam) < 1:
		reply(ptype, psource, u'читай хелп по команде...')
		return

	luser = u''
	if lparam[0].count('@') == 1:
		luser = lparam[0]
	elif GROUPCHATS[psource[1]].has_key(lparam[0]):
		luser = get_true_jid(psource[1] + '/' + lparam[0])
	else:
		reply(ptype, psource, u'а эт хто такой? *SCRATCH*')
		return

	lreason = u''
	if len(lparam) > 1:
		lreason = pparameters[len(lparam[0]) + 1:].strip()
	else:
		lreason = None

	muc_access_set(ptype, psource, psource[1], luser, lreason, 'affiliation', 'outcast')

#---------------------------------------------------------------------------------------------------

def muc_admin ( ptype, psource, pparameters ):
	if not GROUPCHATS.has_key(psource[1]):
		reply(ptype, psource, u'эта команда доступна только в конференции')
		return

	lparam = pparameters.split()
	if len(lparam) < 1:
		reply(ptype, psource, u'читай хелп по команде...')
		return

	luser = u''
	if lparam[0].count('@') == 1:
		luser = lparam[0]
	elif GROUPCHATS[psource[1]].has_key(lparam[0]):
		luser = get_true_jid(psource[1] + '/' + lparam[0])
	else:
		reply(ptype, psource, u'а эт хто такой? *SCRATCH*')
		return

	muc_access_set(ptype, psource, psource[1], luser, None, 'affiliation', 'admin')

#---------------------------------------------------------------------------------------------------

def muc_owner ( ptype, psource, pparameters ):
	if not GROUPCHATS.has_key(psource[1]):
		reply(ptype, psource, u'эта команда доступна только в конференции')
		return

	lparam = pparameters.split()
	if len(lparam) < 1:
		reply(ptype, psource, u'читай хелп по команде...')
		return

	luser = u''
	if lparam[0].count('@') == 1:
		luser = lparam[0]
	elif GROUPCHATS[psource[1]].has_key(lparam[0]):
		luser = get_true_jid(psource[1] + '/' + lparam[0])
	else:
		reply(ptype, psource, u'а эт хто такой? *SCRATCH*')
		return

	muc_access_set(ptype, psource, psource[1], luser, None, 'affiliation', 'owner')

#---------------------------------------------------------------------------------------------------

register_command_handler(muc_participant, 'войс', [ 'админ', 'мук', 'все' ], 15, 'Возвращает юзеру голос', 'войс <jid/nick>', [ 'войс foo@jabber.ru', 'войс Guj' ])
register_command_handler(muc_visitor, 'девойс', [ 'админ', 'мук', 'все' ], 15, 'Забирает право голоса у юзера', 'девойс <jid/nick>', [ 'девойс foo@jabber.ru', 'девойс Guj' ])
register_command_handler(muc_kick, 'кик', [ 'админ', 'мук', 'все' ], 15, 'Выгнать участника', 'кик <jid/nick> [Причина]', [ 'кик guj@jabber.ru', 'кик Guj', 'кик Guj иди на фик' ])
register_command_handler(muc_ban, 'бан', [ 'админ', 'мук', 'все' ], 20, 'Забанить указанного юзера', 'бан <jid/nick> [Причина]', [ 'бан foo@jabber.ru', 'бан Guj', 'бан Guj иди нафик' ])
register_command_handler(muc_none, 'никто', [ 'админ', 'мук', 'все' ], 20, 'Сделать юзера никем (разбанить если забанен)', 'никто <jid/nick>', [ 'никто foo@jabber.ru', 'никто Guj' ])
register_command_handler(muc_member, 'мембер', [ 'админ', 'мук', 'все' ], 20, 'Дать постоянного участника', 'мембер <jid/nick>', [ 'мембер foo@jabber.ru', 'мембер Guj' ])
register_command_handler(muc_moder, 'модер', [ 'админ', 'мук', 'все' ], 20, 'Сделать пользователя временным модератором (на текущую сессию юзера). Пользователь должен быть активен в данный момент в конференции.', 'модер <jid/nick>', [ 'модер foo@jabber.ru', 'модер Guj' ])
register_command_handler(muc_admin, 'админ', [ 'админ', 'мук', 'все' ], 30, 'Дать админа юзеру (бот должен быть овнером конфы)', 'админ <jid/nick>', [ 'админ foo@jabber.ru', 'админ Guj' ])
register_command_handler(muc_owner, 'овнер', [ 'админ', 'мук', 'все' ], 30, 'Дать право владельца (бот должен быть овнером конфы)', 'овнер <jid/nick>', [ 'овнер foo@jabber.ru', 'овнер Guj' ])

#---------------------------------------------------------------------------------------------------
